/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package bs.stock.modelo;

import bs.entidad.modelo.EntidadComercial;
import bs.global.modelo.Auditoria;
import bs.global.modelo.Formulario;
import bs.global.modelo.Sucursal;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

/**
 *
 * @author ctrosch
 */
@Entity
@Table(name = "st_movimiento")
public class MovimientoStock implements Serializable {
    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)    
    @Column(name = "ID", nullable = false)
    private Integer id;
    
    /**
     * Comprobante de stock
     */
    @JoinColumns({
    @JoinColumn(name = "MODCOM", referencedColumnName = "MODCOM"),
    @JoinColumn(name = "CODCOM", referencedColumnName = "CODCOM")
    })
    @ManyToOne(fetch = FetchType.LAZY)
    ComprobanteStock comprobante;
        
    @JoinColumns({
    @JoinColumn(name = "MODFOR", referencedColumnName = "MODFOR"),
    @JoinColumn(name = "CODFOR", referencedColumnName = "CODFOR")
    })
    @ManyToOne(fetch = FetchType.LAZY)
    Formulario formulario;
            
    @Column(name = "NROFOR", nullable = false)
    private int numeroFormulario;

    //Sucursal o punto de venta
    @JoinColumn(name = "SUCURS", referencedColumnName = "CODIGO")
    @ManyToOne(fetch = FetchType.LAZY)
    private Sucursal sucursal;
    
    @Column(name = "FCHMOV", nullable = false)
    @Temporal(TemporalType.DATE)
    private Date fechaMovimiento;

    /**
     * Tipo de movimiento
     * A = Ajuste
     * I = Ingreso
     * E = Egreso
     * T = Transferencia
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "TIPMOV", length = 1)
    private TipoMovimientoStock tipoMovimiento;
    
    //Entidad comercial
    @JoinColumn(name = "NROCTA", referencedColumnName = "NROCTA", nullable = false)
    @ManyToOne(fetch = FetchType.LAZY)
    private EntidadComercial entidadComercial;
    
    
    /**
     * Deposito egreso
     */
    @JoinColumn(name = "DEPEGR", referencedColumnName = "CODIGO")
    @ManyToOne(fetch = FetchType.LAZY)
    private Deposito depositoEgreso;

        /**
     * Deposito ingreso
     */
    @JoinColumn(name = "DEPING", referencedColumnName = "CODIGO")
    @ManyToOne(fetch = FetchType.LAZY)
    private Deposito depositoIngreso;

    /**
     * Mascara de stock
     */
    @Column(name = "MASCAR", length = 6)
    private String mascara;
    /**
     * Observaciones textos
     */
    @Lob
    @Column(name = "TEXTOS", length = 65535)
    private String textos;

    /**
     *  Control de impresión
     */
    @Column(name = "IMPRES")
    private Short controlDeImpresion;
    
    @Column(name = "COFLIS", length = 6)
    private String coflis;
    @Column(name = "COTIZA", precision = 15, scale = 4)
    private BigDecimal cotizacion;
    
    @Column(name = "TIPOPR", length = 6)
    private String tipopr;
    @Column(name = "CODOPR", length = 30)
    private String codopr;
    
    @Column(name = "ISANUL")
    private String esAnulacion;

    @Embedded
    private Auditoria auditoria;    

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "movimiento", fetch=FetchType.LAZY)
    private List<ItemProducto> itemProducto;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "movimiento", fetch=FetchType.LAZY)
    private List<ItemTransferencia> itemTransferencia;

    @Transient
    private boolean persistido;

    @Transient
    private String nserie;

    @Transient
    private String ndespa;

    @Transient
    private String envase;

    @Transient
    private String notros;

    public MovimientoStock() {
        
        this.auditoria = new Auditoria();
        this.itemProducto = new ArrayList<ItemProducto>();
        this.itemTransferencia = new ArrayList<ItemTransferencia>();
        
    }

    public MovimientoStock(Formulario formulario) {

        this.auditoria = new Auditoria();
        this.itemProducto = new ArrayList<ItemProducto>();
        this.itemTransferencia = new ArrayList<ItemTransferencia>();
        
        this.formulario = formulario;
        this.sucursal = formulario.getSucursal();

    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public ComprobanteStock getComprobante() {
        return comprobante;
    }

    public void setComprobante(ComprobanteStock comprobante) {
        this.comprobante = comprobante;
    }

    public Formulario getFormulario() {
        return formulario;
    }

    public void setFormulario(Formulario formulario) {
        this.formulario = formulario;
    }

    public int getNumeroFormulario() {
        return numeroFormulario;
    }

    public void setNumeroFormulario(int numeroFormulario) {
        this.numeroFormulario = numeroFormulario;
    }

    public Sucursal getSucursal() {
        return sucursal;
    }

    public void setSucursal(Sucursal sucursal) {
        this.sucursal = sucursal;
    }

    public Date getFechaMovimiento() {
        return fechaMovimiento;
    }

    public void setFechaMovimiento(Date fechaMovimiento) {
        this.fechaMovimiento = fechaMovimiento;
    }

    public TipoMovimientoStock getTipoMovimiento() {
        return tipoMovimiento;
    }

    public void setTipoMovimiento(TipoMovimientoStock tipoMovimiento) {
        this.tipoMovimiento = tipoMovimiento;
    }

    public EntidadComercial getEntidadComercial() {
        return entidadComercial;
    }

    public void setEntidadComercial(EntidadComercial entidadComercial) {
        this.entidadComercial = entidadComercial;
    }
    
    public Deposito getDepositoEgreso() {
        return depositoEgreso;
    }

    public void setDepositoEgreso(Deposito depositoEgreso) {
        this.depositoEgreso = depositoEgreso;
    }

    public Deposito getDepositoIngreso() {
        return depositoIngreso;
    }

    public void setDepositoIngreso(Deposito depositoIngreso) {
        this.depositoIngreso = depositoIngreso;
    }

    public String getMascara() {
        return mascara;
    }

    public void setMascara(String mascara) {
        this.mascara = mascara;
    }

    public String getTextos() {
        return textos;
    }

    public void setTextos(String textos) {
        this.textos = textos;
    }

    public Short getControlDeImpresion() {
        return controlDeImpresion;
    }

    public void setControlDeImpresion(Short controlDeImpresion) {
        this.controlDeImpresion = controlDeImpresion;
    }

    public String getCoflis() {
        return coflis;
    }

    public void setCoflis(String coflis) {
        this.coflis = coflis;
    }

    public BigDecimal getCotizacion() {
        return cotizacion;
    }

    public void setCotizacion(BigDecimal cotizacion) {
        this.cotizacion = cotizacion;
    }

    public String getTipopr() {
        return tipopr;
    }

    public void setTipopr(String tipopr) {
        this.tipopr = tipopr;
    }

    public String getCodopr() {
        return codopr;
    }

    public void setCodopr(String codopr) {
        this.codopr = codopr;
    }

    public String getEsAnulacion() {
        return esAnulacion;
    }

    public void setEsAnulacion(String esAnulacion) {
        this.esAnulacion = esAnulacion;
    }

    public Auditoria getAuditoria() {
        return auditoria;
    }

    public void setAuditoria(Auditoria auditoria) {
        this.auditoria = auditoria;
    }

    public List<ItemProducto> getItemProducto() {
        return itemProducto;
    }

    public void setItemProducto(List<ItemProducto> itemProducto) {
        this.itemProducto = itemProducto;
    }

    public List<ItemTransferencia> getItemTransferencia() {
        return itemTransferencia;
    }

    public void setItemTransferencia(List<ItemTransferencia> itemTransferencia) {
        this.itemTransferencia = itemTransferencia;
    }

    public boolean isPersistido() {
        return persistido;
    }

    public void setPersistido(boolean persistido) {
        this.persistido = persistido;
    }

    public String getNserie() {
        return nserie;
    }

    public void setNserie(String nserie) {
        this.nserie = nserie;
    }

    public String getNdespa() {
        return ndespa;
    }

    public void setNdespa(String ndespa) {
        this.ndespa = ndespa;
    }

    public String getEnvase() {
        return envase;
    }

    public void setEnvase(String envase) {
        this.envase = envase;
    }

    public String getNotros() {
        return notros;
    }

    public void setNotros(String notros) {
        this.notros = notros;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 47 * hash + (this.id != null ? this.id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final MovimientoStock other = (MovimientoStock) obj;
        if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "MovimientoStock{" + "id=" + id + '}';
    }
    
}
